package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/***
 * 生产者
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
@RequiredArgsConstructor
public class ProducerSend {

    // 注入RabbitTemplate模板对象（集成RabbitMQ时发送是通过这个对象）
    private final RabbitTemplate rabbitTemplate;

    /**
     * 向优先级队列发送消息。
     * 其中第1005条消息被设定为优先级较高（priority=5），其余消息默认为priority=0。
     *
     * @param msg 消息数据实体（会被序列化为JSON字符串）
     */
    public void sendMessage(MessageSendDTO msg) {
        // 模拟发送10条消息（从1001到1010）
        for (int i = 1001; i <= 1010; i++) {
            msg.setMsgID(i); // 设置消息唯一编号

            // 将消息对象转为 JSON 字节数组
            byte[] bytes = JSONObject.toJSONString(msg).getBytes(StandardCharsets.UTF_8);

            // 让第1005条消息拥有更高的优先级（优先被消费者处理）
            if (i == 1005) {
                // 创建消息属性对象，设置优先级
                MessageProperties messageProperties = new MessageProperties();
                messageProperties.setPriority(5); // 优先级范围通常为 0 ~ 10（必须与队列配置一致）
                // 构造完整的消息对象（包含内容和属性）
                Message message = new Message(bytes, messageProperties);

                // 发送到指定交换机和路由键
                rabbitTemplate.convertAndSend(
                        RabbitMQConfig.PRIORITY_DIRECT_EXCHANGE,
                        RabbitMQConfig.PRIORITY_KEY,
                        message
                );
            } else {
                // 普通消息（无优先级，默认为0）
                rabbitTemplate.convertAndSend(
                        RabbitMQConfig.PRIORITY_DIRECT_EXCHANGE,
                        RabbitMQConfig.PRIORITY_KEY,
                        bytes
                );
            }
        }
    }
}